#include "sync.h"

extern int finddir(char *path);					  //寻找是否存在文件夹
extern int find_file(char *path, char *filename); //在B中寻找文件，非递归
extern int LastTime(char *file1, char *file2);
extern int CompareFile(char *file1, char *file2); //比较文件函数 ，相等返回1，否则返回0

void dir_same1(char *src, char *dest)
{ //删除B目录中没有的文件和比较同名文件
	DIR *dir1;
	dir1 = opendir(src); //打开源目录
	struct dirent *entry1;
	char path1[PATH_MAX] = {0}; //存放子目录的路径
	char path2[PATH_MAX] = {0};
	if (dir1 == NULL)
	{
		perror("fail to open src:");
		exit(-1);
	}
	while (1)
	{
		entry1 = readdir(dir1);
		if (entry1 == NULL)
			break;
		if ((strcmp(entry1->d_name, ".") == 0) || (strcmp(entry1->d_name, "..") == 0))
		{
			continue;
		}
		sprintf(path1, "%s/%s", src, entry1->d_name);
		sprintf(path2, "%s/%s", dest, entry1->d_name);
		//递归目录
		if (entry1->d_type & DT_DIR)
		{
			if (!finddir(path2)) // B中不存在文件夹,则复制该文件夹
			{
				char s[1024] = {0};
				sprintf(s, "cp -rvp %s %s", path1, path2);
				system(s);
				printf("同步 %s 目录成功！\n", path1);
				sprintf(s, "echo '同步 %s 目录成功！' >>log.txt", path1); //写入log文件
				system(s);
			}
			else
				dir_same1(path1, path2);
		}
		else //文件
		{
			if (!find_file(dest, entry1->d_name)) //在B目录中查找文件，没找到，则复制A中的文件
			{
				char s[1024] = {0};
				printf("\n");
				sprintf(s, "cp -vp %s %s", path1, path2);
				system(s);
				printf("%s文件同步成功！\n", path1);
				sprintf(s, "echo '%s 文件同步成功！' >>log.txt", path1); //写入log文件
				system(s);
			}
			else //存在同名文件，则比较两个文件
			{
				if (!CompareFile(path1, path2)) //文件不相同时,以最新的日期为准
				{
					if (LastTime(path1, path2) == 0)
					{
						char s[1024] = {0};
						sprintf(s, "cp -vp %s %s", path1, path2);
						printf("\n");
						system(s);
						printf("%s文件同步成功！\n", path1);
						sprintf(s, "echo '相同文件，以时间最新的文件 %s 为准！' >>log.txt", path1); //写入log文件
						system(s);
					}
					else
					{
						char s[1024] = {0};
						sprintf(s, "cp -vp %s %s", path2, path1);
						system(s);
						printf("%s文件同步成功！\n", path2);
						sprintf(s, "echo '相同文件，以时间最新的文件 %s 为准！' >>log.txt", path2); //写入log文件
						system(s);
					}
				}
			}
		}
	}
	closedir(dir1);
}

void dir_same2(char *src, char *dest)
{ //复制B中存在而A中不存在的文件
	DIR *dir;
	dir = opendir(dest); //打开目标目录
	struct dirent *entry;
	char path1[PATH_MAX] = {0}; //存放子目录的路径
	char path2[PATH_MAX] = {0};
	if (dir == NULL)
	{
		perror("fail to open dest");
		exit(-1);
	}
	while (1)
	{
		entry = readdir(dir);
		if (entry == NULL)
			break;
		if ((strcmp(entry->d_name, ".") == 0) || (strcmp(entry->d_name, "..") == 0))
		{
			continue;
		}
		sprintf(path1, "%s/%s", src, entry->d_name);  // dest子路径
		sprintf(path2, "%s/%s", dest, entry->d_name); // src 子路径
		//递归目录
		if (entry->d_type & DT_DIR)
		{
			if (!finddir(path1)) // A中不存在文件夹,则复制该文件夹
			{
				char s[1024] = {0};
				sprintf(s, "cp -rvp %s %s", path2, path1);
				system(s);
				printf("同步 %s 目录成功！\n", path2);
				sprintf(s, "echo '同步 %s 目录成功！' >>log.txt", path2); //写入log文件
				system(s);
			}
			else
				dir_same2(path1, path2);
		}
		else //文件
		{
			if (!find_file(src, entry->d_name)) //在A目录中查找文件，没找到，则复制到A中
			{
				char s[1024] = {0};
				printf("\n");
				sprintf(s, "cp -vp %s %s", path2, path1);
				system(s);
				printf("%s文件同步成功！\n", path1);
				sprintf(s, "echo '同步 %s 目录成功！' >>log.txt", path2); //写入log文件
				system(s);
			}
		}
	}
	closedir(dir);
}

void syncAB(char *src, char *dest)
{
	system("echo '------双向同步 A<—>B'>>log.txt");
	pid_t pid;
	pid = fork();
	if (pid < 0)
	{
		perror("fail to fork:");
		exit(-1);
	}
	else if (pid == 0)
	{ //子进程
		dir_same1(src, dest);
		exit(0);
	}
	else
	{ //父进程
		wait(NULL);
		dir_same2(src, dest);
	}
}

